import json
from time import sleep

import pandas as pd
import requests
from bs4 import BeautifulSoup

# 加载投诉类型配置
types = {}
# 从type.json文件中读取投诉类型的配置信息
with open('../static/data/type.json', 'r', encoding='utf-8') as types_file:
    for t in json.load(types_file):
        types[t['value']] = {
            'name': t['name'],  # 投诉类型名称
            'items': t['items'] # 投诉类型下的具体项目
        }

# 设置请求头，模拟浏览器访问
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
}

# 定义CSV文件的列名
columns_name = ['id', 'brand', 'series', 'type', 'description', 'problem', 'time', 'status']

def main():
    """
    主函数：控制爬虫的执行流程
    1. 遍历页面
    2. 获取每页数据
    3. 解析数据
    4. 保存到CSV文件
    """
    data = []
    # 原始页面范围：1-2563，这里设置为1-1000用于测试
    # for i in range(1,2563):
    for i in range(1, 1001):
        # 构造目标URL，format: 页码
        url = f"https://www.12365auto.com/zlts/0-0-0-0-0-0_0-0-0-0-0-0-0-{i}.shtml"
        print(f'第{i}页')
        # 获取页面HTML内容
        html = request_html(url)
        # 解析HTML并添加到数据列表
        data += parse_html(html)
        # 休眠1秒，避免请求过于频繁
        sleep(1)
    # 将收集的所有数据保存到CSV文件
    save_data_to_csv(data)

def request_html(url):
    """
    发送HTTP请求获取页面内容
    
    Args:
        url (str): 目标页面URL
    
    Returns:
        str: 页面的HTML内容
    """
    response = requests.get(url, headers=headers)
    html = response.text
    return html

def parse_html(html):
    """
    解析HTML页面内容，提取投诉数据
    
    Args:
        html (str): 页面的HTML内容
    
    Returns:
        list: 解析后的数据列表，每个元素为一条投诉记录
    """
    # 使用BeautifulSoup解析HTML
    soup = BeautifulSoup(html, 'lxml')
    # 选择所有tr标签
    tr_list = soup.select('tr')
    # 存储临时解析数据
    info = []
    
    # 提取每个tr中的文本内容
    for tr in tr_list:
        _temp = []
        # 合并th和td标签的文本内容
        for s in tr.select('th') + tr.select('td'):
            _temp.append(s.text)
        info.append(_temp)
    
    # 处理提取的数据
    data = []
    # 跳过表头，处理每一行数据
    for i in info[1:]:
        # 处理问题类型字段（第6列）
        _t = i[5].split(',')
        _temp = []
        # 解析问题类型代码
        for j in _t:
            # 获取主类型
            _type = types[j[0]]
            # 将主类型名称和子类型标题用'|'连接
            _temp.append(
                '|'.join(
                    [
                        _type['name']] + [item['title'] for item in _type['items'] if 
                                        len(j) > 1 and int(j[1:]) == item['id']]
                )
            )
        # 用逗号连接所有问题类型
        i[5] = ','.join(_temp)
        data.append(i)
    
    print(data)
    return data

def save_data_to_csv(data):
    """
    将解析后的数据保存为CSV文件
    
    Args:
        data (list): 解析后的数据列表
    """
    # 创建DataFrame对象
    df = pd.DataFrame(data, columns=columns_name)
    # 保存为CSV文件，使用utf_8_sig编码以支持中文
    df.to_csv('../static/data/data_test.csv', index=False, encoding='utf_8_sig')

if __name__ == '__main__':
    main()
